#ifndef NES_H
#define NES_H
#include <mutex>
#include "H_NES_CPP.h"
#include "NES_Palette.h"




class NES:public H_NES_CPP{



  public:
    void* mainwindow;

    /**
     * @brief 设置音频采样率
     * @param SampleRate 音频采样率
     * @return 0:成功 其他:失败
     */
    int SetSampleRate(H_NES_CPP::SampleRate SampleRate);

    /**
     * @brief 设置音频样本位数
     * @param NumOfSampleBit 样本位数 可为8 16 32
     * @return 0:成功 其他:失败
     */
    int SetNumOfSampleBit(int NumOfSampleBit);

    /**
     * @brief 设置音频格式
     * @param SampleRate 音频采样率
     * @param NumOfSampleBit 样本位数 可为8 16 32
     * @return 0:成功 其他:失败
     */
    int SetFormat(H_NES_CPP::SampleRate SampleRate,int NumOfSampleBit);

    /**
     * @brief 设置调色板
     * @param palette 要设置的调色板
     * @return 无
     */
    void SetPalette(NES_Palette* palette);

    /**
     * @brief 获取调色板
     * @return 当前调色板
     */
    NES_Palette* GetPalette();

    /**
     * @brief 构造函数
     * @param SampleRate 默认采样率
     * @param NumOfSampleBit 样本位数
     * @param mainwindow 特定mainwindow
     */
    NES(H_NES_CPP::SampleRate SampleRate,int NumOfSampleBit,void* mainwindow);

    virtual ~NES();

    void FrameOutput(unsigned char* ColorIndexArray);

    void AudioOutput(int32_t* AudioSampleArray,int Length);

    uint32_t GetStandardControllerStatus();

  private:
    H_NES_CPP::SampleRate SampleRate;
    int NumOfSampleBit;
    std::mutex* audioOutputLock;
    std::mutex* videoOutputLock;

    unsigned char* AudioBuffer;
    int AudioBufferLength;

    int FrameRadioMult;
    uint32_t* Bitmap;
    NES_Palette* palette;

    int AudioOpen();
    int SampleRate_NumOfBit_Update();
    void AudioDataOutput_8(void* AudioSampleArray,int Length);
    void AudioDataOutput_16(void* AudioSampleArray,int Length);
    void AudioDataOutput_32(void* AudioSampleArray,int Length);
};




#endif // NES_H
